// app.js

// 引入 STOMP 库 (确保您已将适配后的 stomp.js 放入 utils 目录)
const Stomp = require('./utils/stomp.js').Stomp;

// ⚠️ 替换为您的 Spring Boot 后端地址 (如果本地运行，请使用开发工具的 "不校验合法域名" 或配置 HTTPS)
const BASE_URL = 'http://172.23.234.238:8080'; 
// 替换为您的 WebSocket 地址 (与 BASE_URL 端口一致，并指向 /ws 端点)
const WS_URL = 'ws://127.0.0.1:8080/ws/websocket'; 

App({
  globalData: {
    userInfo: null, // 存储当前登录用户的 ID, nickname, role 等
    token: null,    // 存储登录 Token
    stompClient: null, // 存储 STOMP 客户端实例
  },

  onLaunch: function() {
    // 启动时尝试从本地缓存加载用户信息
    const userInfo = wx.getStorageSync('userInfo');
    if (userInfo) {
      this.globalData.userInfo = userInfo;
      // 检查是否在开发工具且启用了本地调试，避免生产环境问题
      if (wx.getSystemInfoSync().platform === 'devtools' || BASE_URL.startsWith('http://localhost')) {
         this.initWebSocket();
      }
    }
  },

  // --- HTTP 请求辅助函数 ---
  request(url, method = 'GET', data = {}) {
    return new Promise((resolve, reject) => {
      wx.request({
        url: BASE_URL + url,
        method: method,
        data: data,
        header: {
          'content-type': 'application/json',
          // 携带 Token，用于后续 API 鉴权
          'Authorization': this.globalData.token ? `Bearer ${this.globalData.token}` : '' 
        },
        success: (res) => {
          // 检查 HTTP 状态码和自定义 success 字段
          if (res.statusCode >= 200 && res.statusCode < 300 && res.data && res.data.success !== false) {
            resolve(res.data);
          } else {
            reject(res.data ? (res.data.message || 'API 请求失败') : '网络请求失败');
          }
        },
        fail: (err) => {
          reject('网络连接失败，请检查后端服务是否运行。');
        }
      });
    });
  },

  // --- WebSocket/STOMP 连接管理 ---
  
  // 🎯 建立 STOMP 连接
  initWebSocket() {
    // 确保用户信息存在且没有重复连接
    if (!this.globalData.userInfo) return;
    if (this.globalData.stompClient) {
        console.log("WebSocket 客户端已存在，跳过连接。");
        return;
    }

    console.log('正在连接 WebSocket:', WS_URL);

    // 使用 STOMP 库创建客户端实例
    // ⚠️ 注意：这里传入的是 URL，STOMP 库内部会使用 wx.WebSocket 进行适配。
    const client = Stomp.over(WS_URL);
    
    // 禁用 STOMP 调试信息，保持控制台清爽
    client.debug = (str) => { /* console.log("STOMP Debug:", str); */ }; 

    client.connect({}, (frame) => {
      // 连接成功回调
      this.globalData.stompClient = client;
      console.log('✅ STOMP 连接成功');

      const userId = this.globalData.userInfo.id;
      const role = this.globalData.userInfo.role;
      
      // 🎯 医生端订阅私人预约队列，实现实时推送
      if (role === 'doctor') {
        // 订阅地址：/user/{userId}/queue/newAppointment
        client.subscribe(`/user/${userId}/queue/newAppointment`, (message) => {
          this.handleNewAppointment(JSON.parse(message.body));
        }, {}); // {} 用于可选的 Headers
      }
      
    }, (error) => {
      // 连接错误或断开回调
      console.error('❌ STOMP 连接错误或断开:', error);
      this.globalData.stompClient = null;
      // 尝试重新连接 (生产环境需要更复杂的重连策略)
      // setTimeout(() => this.initWebSocket(), 5000); 
    });
  },

  // 🎯 医生端接收到新预约推送的回调函数
  handleNewAppointment(appointmentData) {
    console.log('收到新预约推送:', appointmentData);
    
    // 顶部弹出提示
    wx.showToast({
      title: `${appointmentData.userNickname} 预约了您！`,
      icon: 'success',
      duration: 5000
    });
    
    // 触发医生端预约列表页的刷新
    // 通过判断是否存在全局注册的页面实例，实现及时响应
    if (this.doctorAppointmentPage) {
      console.log("正在调用医生端页面刷新函数...");
      this.doctorAppointmentPage.loadAppointments();
    }
  },
  
  // 登出时断开 WebSocket
  disconnectWebSocket() {
    if (this.globalData.stompClient) {
      this.globalData.stompClient.disconnect(() => {
        this.globalData.stompClient = null;
        console.log("STOMP Disconnected");
      });
    }
  }
});